package py.com.alfa.escriba.gui.services;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;

import py.com.alfa.escriba.gui.dto.admin.BarrioDTO;
import py.com.alfa.escriba.gui.dto.admin.DepartamentoDTO;
import py.com.alfa.escriba.gui.dto.admin.DistritoDTO;
import py.com.alfa.escriba.gui.dto.admin.FormulariosDTO;
import py.com.alfa.escriba.gui.dto.admin.PaisDTO;
import py.com.alfa.escriba.gui.dto.admin.TabRefDTO;
import py.com.alfa.escriba.gui.dto.gestion.MonedasDTO;
import py.com.alfa.escriba.gui.rest.services.ReferenciaService;


public class HelperService {

	private ReferenciaService refe;
	private HashMap<String, List<TabRefDTO>> tablas;
	private List<DepartamentoDTO> departamentos;
	private HashMap<Long, List<DistritoDTO>> distritos;
	private HashMap<Long, List<BarrioDTO>> barrios;
	private List<PaisDTO> paises;
	private List<MonedasDTO> monedas;
	private List<FormulariosDTO> formularios;
	
	public HelperService() {
		this.tablas = new HashMap<String, List<TabRefDTO>>();
		this.distritos = new HashMap<Long, List<DistritoDTO>>();
		this.barrios = new HashMap<Long, List<BarrioDTO>>();
	}
	
	public List<TabRefDTO> getTablaRef(String key) throws IOException {
		List<TabRefDTO> result = null;
		
		if ( !this.tablas.containsKey(key)) {
		  	result = this.getRefe().obtenerTablaReferencia(key);
		  	if ( result != null) {
		  		this.tablas.put(key, result);
		  	}
		} else {
			result = this.tablas.get(key);
		}		
		return result;
	}
	
	public TabRefDTO getTablaRef(String key, Long id) throws IOException {
		List<TabRefDTO> result = this.getTablaRef(key);
		
		if ( result == null) {
			return null;
		}
	    for (TabRefDTO dto : result) {
			if ( dto.getId().equals(id)) {
				return dto;
			}
		}
		return null;
	}
	public TabRefDTO getTablaRef(String tabla, String codigo ) throws IOException {
		List<TabRefDTO> result = this.getTablaRef(tabla);
		
		if ( result == null) {
			return null;
		}
	    for (TabRefDTO dto : result) {
			if ( dto.getCodigo().equals(codigo)) {
				return dto;
			}
		}
		return null;
	}

	public List<DepartamentoDTO> getDepartamentos() throws IOException {
		if ( this.departamentos == null) {
			this.departamentos = this.getRefe().obtenerDepartamentos();
		}
		
		return this.departamentos;
	}
	
	public DepartamentoDTO getDepartamentoById(Long id) throws IOException {
	  
		for (DepartamentoDTO dto : this.getDepartamentos()) {
			if ( dto.getId().equals(id)) {
				return dto;
			}
		}
		return null;
	}
	
	public List<DistritoDTO> getDistritos(Long idDepartamento) throws IOException {
		if ( this.distritos.containsKey(idDepartamento)) {
			return this.distritos.get(idDepartamento);
		}
		List<DistritoDTO> res = this.getRefe().obtenerDistritos(idDepartamento);
		if ( res != null ) {
			this.distritos.put(idDepartamento, res);
		}
		return res;
	}
	
	public DistritoDTO getDistritoById(Long idDepartamento, Long id) throws IOException {
		List<DistritoDTO> res = this.getDistritos(idDepartamento);
		if ( res == null || res.isEmpty()) {
			return null;
		}
		for (DistritoDTO dto : res) {
			if ( dto.getId().equals(id)) {
				return dto;
			}
		}
		return null;
	}
	
	public List<BarrioDTO> getBarrios(Long idDistrito) throws IOException {
		if ( this.barrios.containsKey(idDistrito)) {
			return this.barrios.get(idDistrito);
		}
		List<BarrioDTO> res = this.getRefe().obtenerBarrios(idDistrito);
		if ( res != null ) {
			this.barrios.put(idDistrito, res);
		}
		return res;
	}
	
	public BarrioDTO getBarrioById(Long idDistrito, Long id) throws IOException {
		List<BarrioDTO> res = this.getBarrios(idDistrito);
		if ( res == null || res.isEmpty()) {
			return null;
		}
		for (BarrioDTO dto : res) {
			if ( dto.getId().equals(id)) {
				return dto;
			}
		}
		return null;
	}
	
	public List<PaisDTO> getPaises() throws IOException {
		if ( this.paises == null) {
			this.paises = this.getRefe().listPaises();
		}
		
		return this.paises;
	}
	
	public PaisDTO getPaisById(Long id) throws IOException {
		List<PaisDTO> res = this.getPaises();
		if ( res == null || res.isEmpty()) {
			return null;
		}
		
		for (PaisDTO dto : res) {
			if ( dto.getId().equals(id)) {
				return dto;
			}
		}
		return null;
	}
	
	public PaisDTO getPaisByCodigo(String codigo) throws IOException {
		List<PaisDTO> res = this.getPaises();
		if ( res == null || res.isEmpty()) {
			return null;
		}
		
		for (PaisDTO dto : res) {
			if ( dto.getCodigo().equals(codigo)) {
				return dto;
			}
		}
		return null;
	}
	
	public List<MonedasDTO> getMonedas() throws IOException {
		if ( this.monedas == null) {
			this.monedas = this.getRefe().listMonedas();
		}
		
		return this.monedas;
	}
	
	public MonedasDTO getMonedasById(Long id) throws IOException {
		List<MonedasDTO> res = this.getMonedas();
		if ( res == null || res.isEmpty()) {
			return null;
		}
		
		for (MonedasDTO dto : res) {
			if ( dto.getId().equals(id)) {
				return dto;
			}
		}
		return null;
	}
	
	public MonedasDTO getMonedasByCodigo(String codigo) throws IOException {
		List<MonedasDTO> res = this.getMonedas();
		if ( res == null || res.isEmpty()) {
			return null;
		}
		
		for (MonedasDTO dto : res) {
			if ( dto.getCodigo().equals(codigo)) {
				return dto;
			}
		}
		return null;
	}
	
	public List<FormulariosDTO> getFormularios() throws IOException {
		if ( this.formularios == null) {
			this.formularios = this.getRefe().listFormularios();
		}
		
		return this.formularios;
	}
	
	public FormulariosDTO getFormulariosById(Long id) throws IOException {
		List<FormulariosDTO> res = this.getFormularios();
		if ( res == null || res.isEmpty()) {
			return null;
		}
		
		for (FormulariosDTO dto : res) {
			if ( dto.getId().equals(id)) {
				return dto;
			}
		}
		return null;
	}
	
	public ReferenciaService getRefe() {
		return refe;
	}

	public void setRefe(ReferenciaService refe) {
		this.refe = refe;
	}

	
}
